package com.io.netty.protocoltcp;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

//每发送一次都会进行编码，如果进行多次发送，这个方法就会多次被调用，就会进行多次编码
//编码其中传入的泛型，就是要编码的数据类型
public class MyMessageEncoder extends MessageToByteEncoder<MessageProtocol> {
    //这里面的数据是从后面的那个handler中传过来的
    protected void encode(ChannelHandlerContext ctx, MessageProtocol msg, ByteBuf out) throws Exception {
        System.out.println("MyMessageEncoder encode 方法被调用");
        //使用的是用对象来封装数据，把对象中封装的数据的长度，写进缓冲区
        out.writeInt(msg.getLen());
        //将对象中封装的数据的内容，写进缓冲区
        //使用对象对要传输的数据进行封装，也就解决了tcp中的粘包问题
        out.writeBytes(msg.getContent());
        //数据写进缓冲区中之后，会通道自动转发吗？这个不太理解
        //应该是会被通道转发出去的，不然数据就一直在缓冲区，就没有办法到达另一端（这是猜的）
    }
}
